package com.day0425zuoye.Animals;/*
 * @创建者：黄苟苟
 * @创建时间：2021/4/25   18:59
 * @Description描述
 **/

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectTest {
    public static void main(String[] args) throws Exception{
        getField();
        getMethods();
        getConstrucors();
        getCry();
    }
    public static void getField() throws ClassNotFoundException{
        Class clz=Class.forName("com.day0425zuoye.Animals.Animal");
        Field[]fields=clz.getFields();//获取Animal类的属性
        System.out.println("======获取Animal的属性列表======");
        //循环遍历输出Animal的属性
        for (Field field : fields) {
            System.out.println(field.getName());
    }
    }
    public static void getMethods() throws ClassNotFoundException {
        //获取Animal的地址
        Class clz=Class.forName("com.day0425zuoye.Animals.Animal");
        Method[]methods=clz.getDeclaredMethods();//获取Animal类的方法
        System.out.println("======获取Animal的方法列表======");
        //循环遍历输出Animal的方法
        for (Method method : methods) {
            System.out.println(method.getName());
        }

    }
    public static void getConstrucors() throws Exception {
        //获取Animal的地址
        Class clz=Class.forName("com.day0425zuoye.Animals.Animal");
        Constructor[]constructors=clz.getConstructors();//获取Animal类的构造方法
        System.out.println("======获取Animal的构造方法======");
        //循环遍历输出Animal的构造方法
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getName());
        }
    }
    //调用私有方法cry()
    public static void getCry() throws Exception {
        //获取Animal的地址
        Class clz=Class.forName("com.day0425zuoye.Animals.Animal");
        Method cryMethod=clz.getDeclaredMethod("cry");//获取私有的方法cry（）
        cryMethod.setAccessible(true);//获得调用私有方法的权限
        Constructor constructor=clz.getConstructor(String.class,int.class);//获取构造方法
        Object obj=constructor.newInstance("小马驹");//创建一个对象
        System.out.println("======调用私有cry方法======");
        cryMethod.invoke(obj);//执行调用cry方法
    }
}

